package org.example.controller;

import lombok.extern.slf4j.Slf4j;
import org.example.pojo.Result;
import org.example.utils.AliyunOSSOperator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/*
 * 文件上传
 * 在SpringBoot中，文件上传时默认单个文件最大大小为1M
 * 那么如果需要上传大文件，可以在 application.properties 进行如下配置：
 * spring：
 *   servlet:
 *     multipart:
 *       max-file-size: 10MB
 *       max-request-size: 100MB
 */

/**
 * 如果直接存储在服务器的磁盘目录中，存在以下缺点：
 * - 不安全：磁盘如果损坏，所有的文件就会丢失
 * - 容量有限：如果存储大量的图片，磁盘空间有限(磁盘不可能无限制扩容)
 * - 无法直接访问
 * 为了解决上述问题呢，通常有两种解决方案：
 * - 自己搭建存储服务器，如：fastDFS 、MinIO
 * - 使用现成的云服务，如：阿里云，腾讯云，华为云
 */
@Slf4j
@RestController
public class UploadConrtoller {
    /**
     * 本地磁盘存储代码
     * MultipartFile 常见方法：
     * - String  getOriginalFilename();  //获取原始文件名
     * - void  transferTo(File dest);    //将接收的文件转存到磁盘文件中
     * - long  getSize();   //获取文件的大小，单位：字节
     * - byte[]  getBytes();    //获取文件内容的字节数组
     * - InputStream  getInputStream();    //获取接收到的文件内容的输入流
     */
    /*  @PostMapping("/upload")
    public Result upload(String name , Integer age, MultipartFile file) throws IOException {
        log.info("文件上传：{}，{}，{}", name, age, file);
        String originalFilename = file.getOriginalFilename();//获取原始文件名
        String extension = originalFilename.substring(originalFilename.lastIndexOf("."));//获取文件后缀名
        String newFilename = UUID.randomUUID().toString()+extension;//生成新文件名
        file.transferTo(new File("D:/images/"+newFilename));

        return Result.success();
    }*/

    @Autowired
    private AliyunOSSOperator aliyunOSSOperator;

    @PostMapping("/upload")
    public Result upload(MultipartFile file) throws Exception {
        log.info("文件上传：{}", file.getOriginalFilename());
        //将文件上传到阿里云OSS
        String url = aliyunOSSOperator.upload(file.getBytes(), file.getOriginalFilename());
        log.info("文件上传OSS，url:{}",url);
        return Result.success(url);
    }
}
